package com.tedu.review.day02;

/**
 * 普通类   √
 * 抽象类=抽象方法    关键字abstract
 * 只有行为的概念，没有具体实现行为
 *
 * 与面向对象的多态有绝对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 * 什么情况下是使用？
 * 复杂项目时，需要在不同类中实现，不同功能，首选抽象类【Android常用】
 *
 *
 * 定义抽象类
 * 修饰符 abstract class 类名{}   抽象本身没有任何意义
 * 创建抽象类同时必须存在抽象方法：
 * 修饰符 abstract 返回值 方法名（）; 定义抽象方法，提供给予类使用
 *
 * 抽象类实例化
 * 必须使用多态，向上造型，自身无法实例化，子类
 *
 * 定义   使用   注意
 *
 *
 * 抽象类注意：抽象类和抽象方法必须使用abstract关键字修饰
 *           可以定义静态属性、静态方法需要加空{}，不可以定义抽象属性
 *           抽象类中可以存在构造器、不可以定义静态抽象方法、不可以定义静态抽象属性
 *           可以存在内部类：静态内部类抽象类可以继承抽象类
 *           Java只允许单继承，实现只需继承抽象类
 *           final不能修饰抽象方法
 *
 *
 *
 */

abstract/*static*/ class Animals{    //①抽象类不可以使用static修饰类
    //类定义：   修饰符[abstract|static]  class  类名{}
    public abstract void say();//抽象方法：没有任何实现
    //②不可以定义修饰final[锁死]的抽象方法
    //public final abstract void sleep();
    //③定义抽象属性X | 定义静态属性√
    //abstract int i;
    static int i;//声明未赋值
    //④定义抽象静态的属性 X
    //abstract static  int j;
    //⑤定义静态抽象方法  X 语法：修饰符 [static|abstract]返回值 方法名
    //public static abstract void eat();
    //⑥定义静态方法   √  需要加代码块{}一定空  实现类不需要一定实现
    public static void eat(){};
    //⑦可以存在内部类,可以存在静态内内部类
    public static class Sos{}
    //⑧抽象类存在构造器--  √
    public Animals() {
    }

}

//⑨抽象类可以继承抽象类    √
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}
//

//实现类：子类  继承  抽象类  完成抽象类方法
//⑩实现类【子类】可以继承两个抽象类   X   但是，实现最终继承[子]抽象类
class People extends Animals{

    public void say() {
        System.out.println("人---说话");
    }
}

//实现类:假设Animals 有两个抽象方法  请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{

    public void say() {
        System.out.println("猴---说话");
    }
}

public class 抽象类 {
    public static void main(String[] args) {
        //抽象---实例化【创建对象】---多态：向上造型
        Animals a=new People();
        a.say();//输出：重写后的值   【方法互通】

        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say();
    }
}
